package com.ywyself.service;

import com.jfinal.kit.LogKit;
import com.jfinal.kit.Ret;
import com.ywyself.ext.kit.YsKit;
import com.ywyself.ext.utils.YsStringUtils;
import com.ywyself.plugin.spider.SpiderUtils;
import org.junit.Test;
import sun.rmi.runtime.Log;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class SpiderService {
    public static final SpiderService EXC = new SpiderService();

    /**
     * 添加一个爬取任务
     *
     * @param className    类文件名
     * @param siteUrl      网站地址
     * @param cateUrl      目录地址
     * @param saveDir      文件夹名
     * @param startChapter 从哪个章节开始下载
     * @return
     */
    public YsKit addTask(final String className, final String siteUrl, final String cateUrl, final String saveDir, final String startChapter) {
        if (YsStringUtils.isBlank(className)) {
            return YsKit.fail().msg("请填写类文件名").code("300");
        } else if (YsStringUtils.isBlank(siteUrl)) {
            return YsKit.fail().msg("请填写网站地址").code("300");
        } else if (YsStringUtils.isBlank(cateUrl)) {
            return YsKit.fail().msg("请填写目录地址").code("300");
        } else if (YsStringUtils.isBlank(saveDir)) {
            return YsKit.fail().msg("请填写文件夹名").code("300");
        }
        Thread thread = new Thread(() -> {
            try {
                SpiderUtils.save(className, siteUrl, cateUrl, saveDir, startChapter);
            } catch (IOException e) {
                LogKit.error(e.getLocalizedMessage());
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                LogKit.error(e.getLocalizedMessage());
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                LogKit.error(e.getLocalizedMessage());
                e.printStackTrace();
            } catch (InstantiationException e) {
                LogKit.error(e.getLocalizedMessage());
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                LogKit.error(e.getLocalizedMessage());
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                LogKit.error(e.getLocalizedMessage());
                e.printStackTrace();
            }
        });
        thread.setName("spider_" + saveDir);
        thread.start();
        return YsKit.ok().msg("任务添加完成").code("100");
    }

    /**
     * 章节合并
     *
     * @param foldName 文件夹名
     * @return
     */
    public YsKit mergeFiles(String foldName) {
        if (YsStringUtils.isBlank(foldName)) {
            return YsKit.fail().code("300").msg("文件夹名不能为空");
        }
        // 去除首尾空格
        foldName = foldName.trim();
        try {
            SpiderUtils.merge(foldName);
        } catch (IOException e) {
            LogKit.error(e.getLocalizedMessage());
            e.printStackTrace();
            return YsKit.fail().msg(e.getMessage()).code("300");
        }
        return YsKit.ok().code("100").msg("合并完成");
    }

    public File download(String foldName) {
        File file = SpiderUtils.getMergeFile(foldName);
        if (file == null) {
            return null;
        } else {
            return file;
        }
    }

    /**
     * 获取已经内容的文件夹名
     *
     * @return 没有数据返回null
     */
    public List<String> listFold() {
        List<String> list = SpiderUtils.listFold();
        if (list == null || list.size() == 0) {
            return new ArrayList<>(1);
        } else {
            return list;
        }
    }

    /**
     * 列出正在运行的线程
     *
     * @return id, name, priority, isAlive, isInterrupted
     */
    public List<Map<String, Object>> listRunningThread() {
        List<Map<String, Object>> list = SpiderUtils.listRunningThread();
        if (list == null || list.size() == 0) {
            return null;
        } else {
            return list;
        }
    }
}
